package com.zusmart.core.bean;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;

import com.zusmart.base.activity.Activity;
import com.zusmart.core.bean.cause.BeanDefinitionMultipleException;
import com.zusmart.core.bean.cause.BeanDefinitionNotFoundException;
import com.zusmart.core.condition.ConditionManager;
import com.zusmart.core.config.ConfigSourceManager;
import com.zusmart.core.context.ApplicationContext;
import com.zusmart.core.plugin.PluginManager;
import com.zusmart.core.proxy.ProxyManager;

public interface BeanDefinitionRegistry extends Activity<BeanDefinitionRegistry> {

	/**
	 * 注册Bean定义
	 * 
	 * @param beanDefinition
	 *            Bean定义
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在相同名称则抛出此异常
	 */
	public BeanDefinition attachBeanDefinition(BeanDefinition beanDefinition) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param beanClass
	 *            目标Bean的class
	 * @param beanName
	 *            目标Bean的名称
	 * @param beanScope
	 *            目标Bean的作用域
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(Class<?> beanClass, String beanName, String beanScope) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param beanClass
	 *            目标Bean的class
	 * @param beanName
	 *            目标Bean的名称
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(Class<?> beanClass, String beanName) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param beanClass
	 *            目标Bean的class
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(Class<?> beanClass) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param targetBeanInstance
	 *            目标Bean实例
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(Object targetBeanInstance) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param targetBeanInstance
	 *            目标Bean实例
	 * @param beanName
	 *            目标Bean名称
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(Object targetBeanInstance, String beanName) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param parentBeanDefinition
	 *            父BeanDefinition
	 * @param parentBeanMethod
	 *            实例化的Method
	 * @param beanName
	 *            目标Bean名称
	 * @param beanScope
	 *            目标Bean作用域
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(BeanDefinition parentBeanDefinition, Method parentBeanMethod, String beanName, String beanScope) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param parentBeanDefinition
	 *            父BeanDefinition
	 * @param parentBeanMethod
	 *            实例化的Method
	 * @param beanName
	 *            目标Bean名称
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(BeanDefinition parentBeanDefinition, Method parentBeanMethod, String beanName) throws BeanDefinitionMultipleException;

	/**
	 * 注册Bean定义
	 * 
	 * @param parentBeanDefinition
	 *            父BeanDefinition
	 * @param parentBeanMethod
	 *            实例化的Method
	 * @return Bean定义
	 * @throws BeanDefinitionMultipleException
	 *             存在同名则抛出异常
	 */
	public BeanDefinition attachBeanDefinition(BeanDefinition parentBeanDefinition, Method parentBeanMethod) throws BeanDefinitionMultipleException;

	/**
	 * 取消注册Bean定义
	 * 
	 * @param beanName
	 *            Bean定义名称
	 * @return Bean定义
	 * @throws BeanDefinitionNotFoundException
	 *             当前Bean定义名称不存在则抛出此异常
	 */
	public BeanDefinition detachBeanDefinition(String beanName) throws BeanDefinitionNotFoundException;

	/**
	 * 取消注册Bean定义
	 * 
	 * @param beanDefinition
	 *            Bean定义
	 * @return Bean定义
	 * @throws BeanDefinitionNotFoundException
	 *             当前Bean定义名称不存在则抛出此异常
	 */
	public BeanDefinition detachBeanDefinition(BeanDefinition beanDefinition) throws BeanDefinitionNotFoundException;

	/**
	 * 判断指定名称的Bean是否存在
	 * 
	 * @param beanName
	 *            目标名称
	 * @return true:存在,false:不存在
	 */
	public boolean existsBeanDefinition(String beanName);

	/**
	 * 判断指定类型的Bean是否存在
	 * 
	 * @param beanClass
	 *            目标类型
	 * @return true:存在,false:不存在
	 */
	public boolean existsBeanDefinition(Class<?> beanClass);

	/**
	 * 获取全部的Bean定义名称,Set集合不允许修改
	 * 
	 * @return name集合
	 */
	public Set<String> getBeanDefinitionNames();

	/**
	 * 获取全部的Bean映射,Map集合不允许修改
	 * 
	 * @return mapping集合
	 */
	public Map<String, BeanDefinition> getBeanDefinitionMappings();

	/**
	 * 获取指定名称的Bean定义
	 * 
	 * @param beanName
	 *            bean名称
	 * @return 返回Bean定义
	 * @throws BeanDefinitionNotFoundException
	 *             如果不存在指定的名称,则抛出异常
	 */
	public BeanDefinition getBeanDefinition(String beanName) throws BeanDefinitionNotFoundException;

	/**
	 * 获取指定类型的Bean定义
	 * 
	 * @param beanClass
	 *            bean定义类型,可为接口
	 * @return Bean定义
	 * @throws BeanDefinitionNotFoundException
	 *             不存在,抛出异常
	 * @throws BeanDefinitionMultipleException
	 *             存在多个同类型的,抛出异常
	 */
	public BeanDefinition getBeanDefinition(Class<?> beanClass) throws BeanDefinitionNotFoundException, BeanDefinitionMultipleException;

	/**
	 * 获取指定类型的Bean定义
	 * 
	 * @param beanName
	 *            bean名称
	 * @param beanClass
	 *            bean定义类型,可为接口
	 * @return Bean定义
	 * @throws BeanDefinitionNotFoundException
	 *             如果不存在指定的名称,则抛出异常
	 */
	public BeanDefinition getBeanDefinition(String beanName, Class<?> beanClass) throws BeanDefinitionNotFoundException, BeanDefinitionMultipleException;

	/**
	 * 获取执行类型的Bean定义集合,可传入接口类型
	 * 
	 * @param beanClass
	 *            Bean类型
	 * @return Bean定义集合
	 * @throws BeanDefinitionNotFoundException
	 *             如果不存在指定类型的Bean,则抛出异常
	 */
	public Set<BeanDefinition> getBeanDefinitions(Class<?> beanClass) throws BeanDefinitionNotFoundException;
	
	public ApplicationContext getApplicationContext();

	/**
	 * @return 获取Bean信息解析器
	 */
	public BeanDefinitionResolver getBeanDefinitionResolver();

	/**
	 * 
	 * @return 获取配置管理器
	 */
	public ConfigSourceManager getConfigSourceManager();

	/**
	 * @return 获取注解条件管理器
	 */
	public ConditionManager getConditionManager();

	/**
	 * @return 获取插件管理器
	 */
	public PluginManager getPluginManager();

	/**
	 * @return 获取代理管理器
	 */
	public ProxyManager getProxyManager();

}